package four;

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.MapperFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;

/**
 * 通过ObjectMapper，ObjectWriter和ObjectReader可配置的功能分为两大类：直接影响jackson-databind组件的高级设置；
 * <p>
 * 和影响Streaming API行为的行为的低级设置（JsonParser，JsonGenerator）。
 */
public class FeatureConfigurationExample {
    public static void main(String[] args) {
        //高层级别的配置
        //
        highLevelConfiguration();

        //底层级别的配置
        lowLevelConfiguration();

        //克隆并使用额外的配置i
        cloneAndConfig();
    }

    private static void cloneAndConfig() {
        ObjectMapper baseMapper = new ObjectMapper();

        ObjectMapper specifyMapper = baseMapper.copy();
        specifyMapper.configure(MapperFeature.USE_ANNOTATIONS, false);
    }

    private static void lowLevelConfiguration() {
        ObjectMapper mapper = new ObjectMapper();

        // JsonParser.Feature用于配置解析设置：

        //允许JSON中的C / C ++样式注释（非标准，默认情况下禁用）
        //（注意：在Jackson 2.5中，还有`mapper.enable（feature）`/`mapper.disable（feature）`）
        mapper.configure(JsonParser.Feature.ALLOW_COMMENTS, true);

        //允许（非标准）JSON中未加引号的字段名称：
        mapper.configure(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES, true);

        //允许使用撇号（单引号），非标准
        mapper.configure(JsonParser.Feature.ALLOW_SINGLE_QUOTES, true);


        //
        // JsonGenerator.Feature用于配置底层JSON生成：

        //强制转义非ASCII字符：
        mapper.configure(JsonGenerator.Feature.ESCAPE_NON_ASCII, true);


    }

    private static void highLevelConfiguration() {
        ObjectMapper mapper = new ObjectMapper();

        // SerializationFeature用于更改JSON的编写方式

        //格式化输出
        mapper.enable(SerializationFeature.INDENT_OUTPUT);

        //允许序列化“空” POJO（没有要序列化的属性）
        // （如果没有此设置，则在这些情况下会引发异常)
        mapper.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS);

        //禁用把日期转成时间戳
        // to write java.util.Date, Calendar as number (timestamp):
        mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);


        // DeserializationFeature，用于更改将JSON读取为POJO的方式：

        //防止在遇到未知属性时发生异常
        mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);

        //允许将JSON空字符串（“”）强制转换为null对象值：
        mapper.enable(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT);

    }
}
